#include "queue_linked_list.h"
//一个数据入队列必须要先创建节点
/**
 * ************************************************ 
 * @brief   创建节点并初始化此节点
 * @param   x               Param...
 * @return QueueNode*
 * ************************************************ 
 */
QueueNode* MyQueueNode(QuDataType data)    
{
	QueueNode* cur = (QueueNode *)malloc(sizeof(QueueNode));
	cur->_data = data;
	cur->_next = NULL;
	return cur;
}
/**
 * ************************************************ 
 * @brief   初始化队列结构
 * @param   q               Param...
 */
void QueueInit(LinkedListQueue* q) 
{
	q->_front = NULL;
	q->_rear  = NULL;
}
/**
 * ************************************************ 
 * @brief   队列尾部入数据
 * @param   q                Param...
 * @param   data             Param...
 */
void QueuePush(LinkedListQueue* q, QuDataType data)  
{
	QueueNode * cur = MyQueueNode(data);//先把创建好的节点传过来
	if (q->_front == NULL)              //若是队列本身为空，队列里就只有这一个节点，又为队列头又为队列尾
	{
		q->_front = q->_rear = cur; 
	}
	else
	{
		q->_rear->_next = cur;  //否则，链表尾插操作
		q->_rear = cur;
	}
}
/**
 * ************************************************ 
 * @brief   队列头部出数据
 * @param   q               Param...
 */
void QueuePop(LinkedListQueue* q)         
{
	if (q->_front == NULL)      //本身队列为空，不做操作
	{
		return;
    }
	QueueNode* tmp = q->_front->_next;   //先保留下一个节点，防止断链
	free(q->_front);
	q->_front = tmp;   //更新对列头部
}
/**
 * ************************************************ 
 * @brief   获取队列首部元素
 * @param   q               Param...
 * @return QuDataType
 * ************************************************ 
 */
QuDataType QueueFront(LinkedListQueue* q)   
{
	return q->_front->_data;
}
/**
 * ************************************************ 
 * @brief   获取队列尾部元素
 * @param   q               Param...
 * @return QuDataType
 * ************************************************ 
 */
QuDataType QueueBack(LinkedListQueue* q)
{
	return q->_rear->_data;
}
/**
 * ************************************************ 
 * @brief   判断队列是否为空
 * @param   q               Param...
 * @return int
 * ************************************************ 
 */
int QueueEmpty(LinkedListQueue* q)   
{
	return q->_front == NULL;   //为空，返回1
}
/**
 * ************************************************ 
 * @brief   获取队列中的元素个数
 * @param   q               Param...
 * @return int
 * ************************************************ 
 */
int QueueSize(LinkedListQueue* q)  
{
	QueueNode * cur;
	int count = 0;
	for (cur = q->_front; cur; cur = cur->_next)//循环遍历，计数即可
	{
		count++;
	}
	return count;
}
/**
 * ************************************************ 
 * @brief   销毁队列
 * @param   q               Param...
 */
void QueueDestory(LinkedListQueue* q)  
{
	if (q->_front == NULL)
	{
		return;
	}
	while (q->_front)
	{
		QueuePop(q);//对每一个元素迭代出队即可
	}
}

/*******************************************************2025-11-25******************************************* */

